#include <iostream>

using namespace std;

// class Box
// {
// private:
//     double length;

// public:
//     Box(double length)
//     {
//         this->length = length; // 用this指针区分成员变量和构造函数参数
//     }

//     void setLength(double length)
//     {
//         this->length = length; // 同样在成员函数中区分成员变量和参数
//     }

//     double getLength()
//     {
//         return this->length; // 使用this指针访问成员变量
//     }
// };

class Box
{
private:
    double length;

public:
    Box &setLength(double length)
    {
        this->length = length;
        return *this; // 返回对象本身的引用
    }

    void display()
    {
        std::cout << "Length: " << length << std::endl;
    }
};

class Base
{
public:
    virtual void show()
    {
        std::cout << "Base show" << std::endl;
    }

    void display()
    {
        // this->show(); // 调用的是实际对象的show()方法
        show();
    }
};

class Derived : public Base
{
public:
    void show() override
    {
        std::cout << "Derived show" << std::endl;
    }
};

int main()
{

    // Box box(10.0);
    // Box box;
    // box.setLength(5.0).display(); // 链式调用

    Derived d;
    Base *b = &d;
    b->display(); // 尽管指针是Base类的，但调用的是Derived的show()方法
    return 0;

    return 0;
}